---
sidebar_position: 4
---

# Указания по выполнению работы

## Иерархия классов

1. Для определения иерархии классов связать отношением наследования классы, приведенные в приложении (для [заданного варианта](TaskVariants.md)). Из перечисленных классов выбрать один, который будет стоять во главе иерархии. Это **абстрактный класс**.
2. Определить в классах **все необходимые конструкторы и деструкторы**. Не забыть в абстрактном классе определить **виртуальный деструктор**.
3. В конструкторах и деструкторах для абстрактного класса и производных классов предусмотреть **вывод отладочных сообщений** об их вызове в консоль. Например:

   ```cpp
   std::cout << "A()" << std::endl;  // при вызове конструктора
   std::cout << "~A()" << std::endl; // при вызове деструктора
   ````

4. **Компонентные данные класса** специфицировать как `protected`.
5. В абстрактном классе объявить виртуальный метод `show`, который отвечает за **отображение данных класса**. В каждом производном классе реализовать данный метод с учетом специфики каждого класса.
6. Определение классов, их реализацию, демонстрационную программу поместить в отдельные файлы. Данные файлы должны быть упакованы в **отдельную статическую библиотеку**.

## Контейнер классов

1. В функции `main()` создать экземпляр **самостоятельно разработанного вектора** из [предыдущей работы](../lab5/intro.md) для реализации контейнера из заданных классов (далее – контейнер). В качестве типа аргумента шаблона использовать **указатель на абстрактный класс** для демонстрации [**полиморфизма**](../../lectures/oop-additional-information/intro.md).

   :::danger
   В работе запрещено использование [контейнеров STL](../../lectures/stl/intro.md) (`vector`, `list` и др.).

   Перед использованием самостоятельно разработанного вектора рекомендуется изучить [статью о линковке шаблонного класса и его специализации](/blog/2024-04-17-inline-template/).
   :::

2. Реализовать функции, которые в качестве аргумента принимают ссылку на контейнер:
   1. Функция `print` для **вывода** всех связанных с контейнером экземпляров производных классов с указанием индекса в контейнере.
   2. Функция `remove` для **удаления** конкретного указателя по заданному индексу из контейнера и для удаления динамического объекта по этому указателю.
   3. Функция `clear` для **очистки** контейнера и удаления всех динамически созданных объектов по указателям из контейнера.

      :::info
      При отладке программы по отладочным сообщениям из деструкторов, убедитесь в корректной работе [виртуальных деструкторов](../../lectures/oop-additional-information/intro.md).
      :::

## Режимы выполнения программы

Для демонстрации проделанной работы, необходимо продемонстрировать:

1. Добавление в контейнер **динамически созданных экземпляров** заданных классов.
2. Работу функции `print`.
3. Работу функции `remove`.
4. Работу функции `clear`.

### Демонстрационный режим

В демонстрационном режиме исполнитель самостоятельно наполняет контейнер всеми возможными экземплярами производных классов.

### Интерактивный режим

В интерактивном режиме указанные выше пункты к демонстрации представить в виде консольного меню (по аналогии интерактивного режима [лабораторной работы №2](../lab2/intro.md)). Данные об экземпляре производном классе вводить с клавиатуры. Индекс объекта к удалению получать от пользователя. Пользователь информацию об индексах должен получать при вызове функции `print` через меню.
